﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using TestesFixacao.Dominio.Modelos;
using TestesFixacao.Dominio.Repositorios;
using TestesFixacao.Dominio.Repositorios.ADO;
using TestesFixacao.WindowsApp.Refatorado.Controls.Shared;
using TestesFixacao.WindowsApp.Refatorado.Extensions;

namespace TestesFixacao.WindowsApp.Refatorado.Controls.MateriaForms
{
    public class MateriaDataManagerImpl : DataManagerBase<Materia>, IDataManager
    {
        private readonly RepositorioAdoDisciplina _repositorioDisciplina;
        private readonly RepositorioAdoSerie _repositorioSerie;

        public MateriaDataManagerImpl()
            : base(new RepositorioAdoMateria(), new MateriaControl())
        {
            _repositorioDisciplina = new RepositorioAdoDisciplina();
            _repositorioSerie = new RepositorioAdoSerie();
        }

        #region IDataManager Members

        public void AddData()
        {
            List<Disciplina> disciplinas = _repositorioDisciplina.SelecionaTodos();
            List<Serie> series = _repositorioSerie.SelecionaTodos();

            var dialog = new MateriaDialog(disciplinas, series, Description());

            dialog.Materia = new Materia();
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                Repositorio.Adiciona(dialog.Materia);
                RefreshAll();
            }
        }

        public void RemoveData()
        {
            var numero = Controle.GetId<int>();
            Materia materia = Repositorio.SelecionaPorId(numero);

            if (materia == null)
            {
                MessageBoxExtension.Show(
                    "Nenhuma Materia selecionada. Selecione uma Materia antes de solicitar a exclusão",
                    MessageEnum.Warning);
                return;
            }
            if (MessageBoxExtension.ShowQuestion("Deseja remover a Materia selecionada?") == DialogResult.Yes)
            {
                try
                {
                    Repositorio.Exclui(materia);
                    RefreshAll();
                }
                catch (Exception e)
                {
                    MessageBoxExtension.Show(e.Message, MessageEnum.Error);
                }
            }
        }

        public void EditData()
        {
            var numero = Controle.GetId<int>();
            Materia materia = Repositorio.SelecionaPorId(numero);

            if (materia == null)
            {
                MessageBoxExtension.Show(
                    "Nenhuma Materia selecionada. Selecionar uma Materia antes de solicitar a edição",
                    MessageEnum.Warning);
                return;
            }

            List<Disciplina> disciplinas = _repositorioDisciplina.SelecionaTodos();
            List<Serie> series = _repositorioSerie.SelecionaTodos();
            var dialog = new MateriaDialog(disciplinas, series, Description());
            dialog.Materia = materia;
            if (dialog.ShowDialog(Controle) == DialogResult.OK)
            {
                Repositorio.Edita(dialog.Materia);
                RefreshAll();
            }
        }

        public string Description()
        {
            return "Cadastro de Matérias";
        }

        public ToolTipMessage GetToolTipMessage()
        {
            var m = new ToolTipMessage();
            m.Add = "Adiciona uma Matéria";
            m.Edit = "Edita uma Matéria";
            m.Delete = "Remove uma Matéria";

            return m;
        }

        public ActionButtonEnabled GetActionButtonEnabled()
        {
            return new ActionButtonEnabled();
        }

        #endregion IDataManager Members
    }
}